/*
 * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
 *
 * SPDX-License-Identifier: Unlicense OR CC0-10
 */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "esp_vfs.h"
#include "esp_vfs_fat.h"
#include "esp_log.h"
#include "sdkconfig.h"

static const char *TAG = "file_reader"; // 日志标签

// 分区挂载路径
const char *base_path = "/spiflash";
static const char *file_name = "example.txt";
static const char *full_path = "/spiflash/example.txt";

// 磨损均衡库实例的句柄
static wl_handle_t s_wl_handle = WL_INVALID_HANDLE;

void app_main(void)
{
    ESP_LOGI(TAG, "文件读取工具启动");
    
    // 配置FAT文件系统挂载参数
    const esp_vfs_fat_mount_config_t mount_config = {
            .max_files = 4,             // 同时可打开的最大文件数
            .format_if_mount_failed = false, // 不自动格式化分区
            .allocation_unit_size = CONFIG_WL_SECTOR_SIZE,
            .use_one_fat = false
    };

    // 挂载FATFS文件系统
    ESP_LOGI(TAG, "正在挂载FAT文件系统，分区名称: 'storage', 挂载路径: %s", base_path);
    esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(base_path, "storage", &mount_config, &s_wl_handle);
    if (err != ESP_OK) {
        ESP_LOGE(TAG, "挂载FATFS失败 (%s)", esp_err_to_name(err));
        if (err == ESP_FAIL) {
            ESP_LOGE(TAG, "提示: 分区可能未格式化。如需格式化，请将 format_if_mount_failed 设为 true");
        }
        return;
    }

    ESP_LOGI(TAG, "文件系统挂载成功");

    // 读取文件内容
    FILE *file = fopen(full_path, "r");
    if (file == NULL) {
        ESP_LOGE(TAG, "无法打开文件: %s", full_path);
        esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle);
        return;
    }

    // 读取并输出文件内容
    char buffer[256];
    ESP_LOGI(TAG, "文件 %s 的内容:", file_name);
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        // 移除换行符以便日志输出
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len-1] == '\n') {
            buffer[len-1] = '\0';
        }
        ESP_LOGI(TAG, "%s", buffer);
    }
    fclose(file);

    // 获取当前时间
    time_t now;
    struct tm timeinfo;
    char strftime_buf[64];
    
    time(&now);
    localtime_r(&now, &timeinfo);
    strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
    
    ESP_LOGI(TAG, "当前日期时间: %s", strftime_buf);

    // 以追加模式打开文件并写入当前日期
    file = fopen(full_path, "a");
    if (file == NULL) {
        ESP_LOGE(TAG, "无法以追加模式打开文件: %s", full_path);
        esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle);
        return;
    }

    // 写入当前日期到文件末尾
    fprintf(file, "\n文件更新于: %s\n", strftime_buf);
    fclose(file);
    
    ESP_LOGI(TAG, "已将当前日期追加到文件末尾");

    // 再次读取文件内容验证写入
    file = fopen(full_path, "r");
    if (file != NULL) {
        ESP_LOGI(TAG, "更新后的文件内容:");
        while (fgets(buffer, sizeof(buffer), file) != NULL) {
            size_t len = strlen(buffer);
            if (len > 0 && buffer[len-1] == '\n') {
                buffer[len-1] = '\0';
            }
            ESP_LOGI(TAG, "%s", buffer);
        }
        fclose(file);
    }

    // 卸载FAT文件系统
    ESP_LOGI(TAG, "卸载FAT文件系统");
    ESP_ERROR_CHECK(esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle));
    
    ESP_LOGI(TAG, "文件操作完成");
}